/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ModulHåndtering;

import java.io.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import jssc.SerialPort;
import static jssc.SerialPort.PURGE_RXCLEAR;
import jssc.SerialPortException;
import jssc.SerialPortList;
import java.awt.Point;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
//import ModulHåndtering.Protokol.*;

/**
 *
 * @author Thor søn af Odin
 */
public class Butler {

    private static final int READ_BUFFER = 50;
    private final String[] portNames = SerialPortList.getPortNames();
    private String handshakeContainer;
    ArrayList<Modul> moduler = new ArrayList<>();
    SerialPort serialPort;

    public void opretModul(SerialPort port, String handshake) {
        boolean modulOprettet = false;
        switch (handshake) {
            case Protokol.HANDSHAKE_MODUL1: // Handshake for modul 1
            {
                moduler.add(new ModulMC(port));
                modulOprettet = true;
                System.out.println("Modul 01 Oprettet.");
                break;
            }
            case Protokol.HANDSHAKE_MODUL2: // Handshake for modul 2
            {
                moduler.add(new ModulFPGA(port));
                modulOprettet = true;
                System.out.println("Modul 02 Oprettet.");
                break;
            }
        }
        if (!modulOprettet) {
            try {
                port.closePort();
            } catch (SerialPortException ex) {
                Logger.getLogger(Butler.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public void opdaterModuler() {
        for (String portName : portNames) {
            serialPort = new SerialPort(portName);
            try {
                serialPort.openPort();
                serialPort.setParams(9600, 8, 1, 0);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Butler.class.getName()).log(Level.SEVERE, null, ex);
                }
                if (serialPort.getInputBufferBytesCount() >= 7) {
                    handshakeContainer = new String(serialPort.readBytes(READ_BUFFER));
                    System.out.println("HandshakeContainer: " + handshakeContainer);
                    if (handshakeContainer.contains(Protokol.HANDSHAKE)) {
                        serialPort.writeBytes("$OKOKOK*".getBytes());
                        System.out.println(formatHandshake(handshakeContainer));
                        opretModul(serialPort, formatHandshake(handshakeContainer));
                    } else {
                        System.out.println("Port ikke godkendt: " + serialPort.getPortName());
                        serialPort.closePort();
                    }
                } else {
                    serialPort.closePort();
                }
            } catch (SerialPortException ex) {
                System.out.println(ex);
            }
        }
    }

    public ArrayList<Modul> getModuler() {
        return moduler;
    }

    private String formatHandshake(String handshakeContainer) {
        do {
            int indexStart = handshakeContainer.indexOf("$") + 1;
            handshakeContainer = handshakeContainer.substring(indexStart);
            if (handshakeContainer.length() < 7) {
                break;
            }
        } while (handshakeContainer.charAt(6) != '*');
        return handshakeContainer.substring(0, 6);
    }

    public void skrivTilFilDataPunkter(Modul modul) {
        JFileChooser chooser = new JFileChooser(); // Ny fil vælger
        ArrayList<Sensor> sensorList = modul.sensorList; // Henter liste med sensorer

        int retrival = chooser.showSaveDialog(null);
        if (retrival == JFileChooser.APPROVE_OPTION) {
            try {
                FileWriter fil = new FileWriter(chooser.getSelectedFile() + ".txt");
                try (PrintWriter ud = new PrintWriter(fil)) // Laver printwriter objekt
                {
                    // Går gennem antal sensorer og tilføjer dem til filen
                    for (Sensor sensor : sensorList) {
                        ArrayList<Point> grafPunkter = sensor.grafPunkter();

                        // Skriver sensor med nummer tilfilen
                        ud.println();
                        ud.println("Sensor: " + sensorList.indexOf(sensor));

                        // Skriver punkter til filen
                        for (Point grafPunkterData : grafPunkter) {
                            ud.println(grafPunkterData);
                        }
                    }
                    // Fordi PW ligger i "try" kaldes close() automatisk
                }
            } catch (IOException ex) {
            }
        }

    }

    public ArrayList<ArrayList> læsFraFilDataPunkter() {
        ArrayList<Point> punktArray = new ArrayList(); // Nyt array af punkter
        ArrayList<ArrayList> grafArray = new ArrayList(); // Nyt array af Arrays

        try {
            // Finder filen og opretter fil objekt
            JFileChooser chooser = new JFileChooser();

            // Bestemmer filter for hvilke fil typer der kan læses
            FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "Text file (*.txt)", "txt");
            chooser.setFileFilter(filter);

            int returnVal = chooser.showOpenDialog(null);
            if (returnVal == JFileChooser.APPROVE_OPTION) {

                FileReader fil = new FileReader(chooser.getSelectedFile());
                BufferedReader ind = new BufferedReader(fil);

                // Læser første linje i filen
                String data = ind.readLine();
                // Kører så længe filen har indhold
                while (data != null) {
                    if (data.contains("Sensor")) {
                        punktArray = new ArrayList<>();
                        data = ind.readLine();

                        while (data.contains("java")) {
                            // Finder værdi af koordinaterne
                            String koordinat1 = data.substring(data.indexOf("=") + 1, data.indexOf(","));
                            String koordinat2 = data.substring(data.indexOf(",") + 3, data.indexOf("]"));

                            // Omregner string koordinaterne til int
                            int førsteKoordinat = Integer.parseInt(koordinat1);
                            int andenKoordinat = Integer.parseInt(koordinat2);

                            // Sætter et punkts koordinater og tilføjer punkt til ArrayList
                            punktArray.add(new Point(førsteKoordinat, andenKoordinat));

                            // Læser næste linje i filen
                            data = ind.readLine();
                            if (data == null) {
                                break; // Breaker hvis der ingen data er
                            }
                        }
                        grafArray.add(punktArray); // Tilføjer punktlisten til graf listen
                    }
                    // Læser næste linje i filen
                    data = ind.readLine();
                }
            }
        } catch (IOException e) {
        }
        return grafArray;
    }

}
